package it.webrules.deploymanager.core;

import it.webrules.deploymanager.core.config.ConfigurationException;
import it.webrules.deploymanager.core.config.ConfigurationService;
import it.webrules.deploymanager.core.dy.build.CIException;
import it.webrules.deploymanager.core.dy.deploy.AvailableServerException;
import it.webrules.deploymanager.core.dy.deploy.DeployException;
import it.webrules.deploymanager.core.dy.repos.RepositoryException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

//TODO autenticazione jmx??
//TODO se do un numero che non esiste o che sta buildando o un file che non esiste??

public class CLIMain {

	private static Logger logger = LoggerFactory.getLogger(CLIMain.class);

	private CLIMain() {
	}

	/**
	 * Passaggi da fare per WEBAPP
	 * 
	 * Todo uso di nexes 
	 * 
	 * Deploy:
	 * 1) invocare build su jenkins, se richiesto
	 * 2) controllo successo build 
	 * 3) copiarla in locale
	 * 4) Per ogni server:
	 *  4.1) HOOK beforestop
	 *  4.2) Stoppare connettore AJP e controllare che sia fermo
	 *  4.3) Attendere completamento richieste in coda
	 *  4.4) HOOK beforeundeploy
	 *  4.5) Undeploy progetto
	 *  4.6) Attesa undeploy
	 *  4.7) HOOK before deploy
	 *  4.8) Copia war
	 *  4.9) Attesa deploy
	 *  4.10) HOOK beforestart
	 *  4.11) Aprire connettore AJP e controllare che sia salito
	 * 	4.12) Controllare che ci sia almeno 60 MB di permgen libera
	 *  4.13) HOOK afterstart
	 * 
	 * Build available:
	 *  1) list of available artifact
	 * 
	 * Passaggi per STATIC (dir legata a svn o altro):
	 * 
	 * Sempre vengono eseguiti:
	 * HOOK beforestart e afterstart
	 * 
	 * Checkout
	 *  1) svn co
	 *   
	 * List branches / tags
	 *  1) list delle cartelle /tags e /branches
	 *   
	 * Stato della cartella: 
	 *  1) ritorna la versione e il repo+path
	 *  
	 * Update della cartella:
	 *  1) svn update
	 *  
	 *  Switch della cartella su tags/branch
	 *  1) svn switch
	 *  
	 *  Status
	 *  1) svn status / info
	 *  
	 *  Lista delle differenze (nomi o contenuti)
	 *  1) svn diff
	 *  
	 *  Revert dei file nella cartella
	 *  1) svn revert
	 *  
	 *  Create tag/branch
	 *  1) svn copy
	 *  
	 *  Create tag/branch and switch
	 *  1) svn copy
	 *  2) svn switch
	 *  
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

		try {

			ConfigurationService configurationService = new ConfigurationService();
			configurationService.configWithArgument(args);

			Object ret = new Main().run(configurationService);

			if (ret != null)
				System.out.println(ret);

			System.exit(0);

		} catch (ConfigurationException e) {
			logger.error("Error configuring build: {}", e.getMessage());

		} catch (AvailableServerException e) {
			logger.error("Error checking server: {}", e.getMessage());

		} catch (CIException e) {
			logger.error("Error preparing deploy: {}", e.getMessage());

		} catch (RepositoryException e) {
			logger.error("Error getting artifact: {}", e.getMessage());

		} catch (DeployException e) {
			logger.error("Error deploying artifact: {}", e.getMessage());

		}

		System.exit(1);

	}

}
